home *** CD-ROM | disk | FTP | other *** search
/ Sky at Night 2007 June / SAN CD 6-2007 CD-ROM 25.iso / pc / Software / AstroGrav_Win / Java / jre1.6.0 / lib / rt.jar / sun / font / FontDesignMetrics.class (.txt) < prev    next >
Encoding:
Java Class File  |  2006-11-29  |  6.5 KB  |  328 lines

  1. package sun.font;
  2.  
  3. import java.awt.Font;
  4. import java.awt.FontMetrics;
  5. import java.awt.GraphicsEnvironment;
  6. import java.awt.font.FontRenderContext;
  7. import java.awt.font.TextLayout;
  8. import java.awt.geom.AffineTransform;
  9. import java.io.IOException;
  10. import java.io.ObjectInputStream;
  11. import java.io.ObjectOutputStream;
  12. import java.util.HashMap;
  13.  
  14. public final class FontDesignMetrics extends FontMetrics {
  15.    static final long serialVersionUID = 4480069578560887773L;
  16.    private static final float UNKNOWN_WIDTH = -1.0F;
  17.    private static final int CURRENT_VERSION = 1;
  18.    private static float roundingUpValue = 0.95F;
  19.    private Font font;
  20.    private float ascent;
  21.    private float descent;
  22.    private float leading;
  23.    private float maxAdvance;
  24.    private double[] matrix;
  25.    private int[] cache;
  26.    private int serVersion;
  27.    private boolean isAntiAliased;
  28.    private boolean usesFractionalMetrics;
  29.    private AffineTransform frcTx;
  30.    private transient float[] advCache;
  31.    private transient int height;
  32.    private transient FontRenderContext frc;
  33.    private transient double[] devmatrix;
  34.    private transient FontStrike fontStrike;
  35.    private static FontRenderContext DEFAULT_FRC = null;
  36.    private static final HashMap<Object, KeyReference> metricsCache = new HashMap();
  37.    private static final int MAXRECENT = 5;
  38.    private static final FontDesignMetrics[] recentMetrics = new FontDesignMetrics[5];
  39.    private static int recentIndex = 0;
  40.  
  41.    private static FontRenderContext getDefaultFrc() {
  42.       if (DEFAULT_FRC == null) {
  43.          AffineTransform var0;
  44.          if (GraphicsEnvironment.isHeadless()) {
  45.             var0 = new AffineTransform();
  46.          } else {
  47.             var0 = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getDefaultConfiguration().getDefaultTransform();
  48.          }
  49.  
  50.          DEFAULT_FRC = new FontRenderContext(var0, false, false);
  51.       }
  52.  
  53.       return DEFAULT_FRC;
  54.    }
  55.  
  56.    public static FontDesignMetrics getMetrics(Font var0) {
  57.       return getMetrics(var0, getDefaultFrc());
  58.    }
  59.  
  60.    public static FontDesignMetrics getMetrics(Font var0, FontRenderContext var1) {
  61.       if (FontManager.maybeUsingAlternateCompositeFonts() && FontManager.getFont2D(var0) instanceof CompositeFont) {
  62.          return new FontDesignMetrics(var0, var1);
  63.       } else {
  64.          FontDesignMetrics var2 = null;
  65.          boolean var4 = var1.equals(getDefaultFrc());
  66.          KeyReference var3;
  67.          if (var4) {
  68.             synchronized(metricsCache) {
  69.                var3 = (KeyReference)metricsCache.get(var0);
  70.             }
  71.          } else {
  72.             synchronized(metricsCache) {
  73.                sun.font.FontDesignMetrics.MetricsKey.key.init(var0, var1);
  74.                var3 = (KeyReference)metricsCache.get(sun.font.FontDesignMetrics.MetricsKey.key);
  75.             }
  76.          }
  77.  
  78.          if (var3 != null) {
  79.             var2 = (FontDesignMetrics)var3.get();
  80.          }
  81.  
  82.          if (var2 == null) {
  83.             var2 = new FontDesignMetrics(var0, var1);
  84.             if (var4) {
  85.                synchronized(metricsCache) {
  86.                   metricsCache.put(var0, new KeyReference(var0, var2));
  87.                }
  88.             } else {
  89.                MetricsKey var5 = new MetricsKey(var0, var1);
  90.                synchronized(metricsCache) {
  91.                   metricsCache.put(var5, new KeyReference(var5, var2));
  92.                }
  93.             }
  94.          }
  95.  
  96.          for(int var16 = 0; var16 < recentMetrics.length; ++var16) {
  97.             if (recentMetrics[var16] == var2) {
  98.                return var2;
  99.             }
  100.          }
  101.  
  102.          synchronized(recentMetrics) {
  103.             recentMetrics[recentIndex++] = var2;
  104.             if (recentIndex == 5) {
  105.                recentIndex = 0;
  106.             }
  107.  
  108.             return var2;
  109.          }
  110.       }
  111.    }
  112.  
  113.    private FontDesignMetrics(Font var1) {
  114.       this(var1, getDefaultFrc());
  115.    }
  116.  
  117.    private FontDesignMetrics(Font var1, FontRenderContext var2) {
  118.       super(var1);
  119.       this.serVersion = 0;
  120.       this.height = -1;
  121.       this.devmatrix = null;
  122.       this.font = var1;
  123.       this.frc = var2;
  124.       this.isAntiAliased = var2.isAntiAliased();
  125.       this.usesFractionalMetrics = var2.usesFractionalMetrics();
  126.       this.frcTx = var2.getTransform();
  127.       this.matrix = new double[4];
  128.       this.initMatrixAndMetrics();
  129.       this.initAdvCache();
  130.    }
  131.  
  132.    private void initMatrixAndMetrics() {
  133.       Font2D var1 = FontManager.getFont2D(this.font);
  134.       this.fontStrike = var1.getStrike(this.font, this.frc);
  135.       StrikeMetrics var2 = this.fontStrike.getFontMetrics();
  136.       this.ascent = var2.getAscent();
  137.       this.descent = var2.getDescent();
  138.       this.leading = var2.getLeading();
  139.       this.maxAdvance = var2.getMaxAdvance();
  140.       this.devmatrix = new double[4];
  141.       this.frcTx.getMatrix(this.devmatrix);
  142.    }
  143.  
  144.    private void initAdvCache() {
  145.       this.advCache = new float[256];
  146.  
  147.       for(int var1 = 0; var1 < 256; ++var1) {
  148.          this.advCache[var1] = -1.0F;
  149.       }
  150.  
  151.    }
  152.  
  153.    private void readObject(ObjectInputStream var1) throws IOException, ClassNotFoundException {
  154.       var1.defaultReadObject();
  155.       if (this.serVersion != 1) {
  156.          this.frc = getDefaultFrc();
  157.          this.isAntiAliased = this.frc.isAntiAliased();
  158.          this.usesFractionalMetrics = this.frc.usesFractionalMetrics();
  159.          this.frcTx = this.frc.getTransform();
  160.       } else {
  161.          this.frc = new FontRenderContext(this.frcTx, this.isAntiAliased, this.usesFractionalMetrics);
  162.       }
  163.  
  164.       this.height = -1;
  165.       this.cache = null;
  166.       this.initMatrixAndMetrics();
  167.       this.initAdvCache();
  168.    }
  169.  
  170.    private void writeObject(ObjectOutputStream var1) throws IOException {
  171.       this.cache = new int[256];
  172.  
  173.       for(int var2 = 0; var2 < 256; ++var2) {
  174.          this.cache[var2] = -1;
  175.       }
  176.  
  177.       this.serVersion = 1;
  178.       var1.defaultWriteObject();
  179.       this.cache = null;
  180.    }
  181.  
  182.    private float handleCharWidth(int var1) {
  183.       return this.fontStrike.getCodePointAdvance(var1);
  184.    }
  185.  
  186.    private float getLatinCharWidth(char var1) {
  187.       float var2 = this.advCache[var1];
  188.       if (var2 == -1.0F) {
  189.          var2 = this.handleCharWidth(var1);
  190.          this.advCache[var1] = var2;
  191.       }
  192.  
  193.       return var2;
  194.    }
  195.  
  196.    public FontRenderContext getFontRenderContext() {
  197.       return this.frc;
  198.    }
  199.  
  200.    public int charWidth(char var1) {
  201.       float var2;
  202.       if (var1 < 256) {
  203.          var2 = this.getLatinCharWidth(var1);
  204.       } else {
  205.          var2 = this.handleCharWidth(var1);
  206.       }
  207.  
  208.       return (int)((double)0.5F + (double)var2);
  209.    }
  210.  
  211.    public int charWidth(int var1) {
  212.       if (!Character.isValidCodePoint(var1)) {
  213.          var1 = 65535;
  214.       }
  215.  
  216.       float var2 = this.handleCharWidth(var1);
  217.       return (int)((double)0.5F + (double)var2);
  218.    }
  219.  
  220.    private boolean requiresLayout(char var1) {
  221.       return var1 >= 1424 && var1 < 3712 || var1 >= 8234 && var1 < 8239 || var1 >= '\ud800' && var1 < '\ue000';
  222.    }
  223.  
  224.    public int stringWidth(String var1) {
  225.       float var2 = 0.0F;
  226.       if (this.font.hasLayoutAttributes()) {
  227.          if (var1 == null) {
  228.             throw new NullPointerException("str is null");
  229.          }
  230.  
  231.          var2 = (new TextLayout(var1, this.font, this.frc)).getAdvance();
  232.       } else {
  233.          int var3 = var1.length();
  234.  
  235.          for(int var4 = 0; var4 < var3; ++var4) {
  236.             char var5 = var1.charAt(var4);
  237.             if (var5 < 256) {
  238.                var2 += this.getLatinCharWidth(var5);
  239.             } else {
  240.                if (this.requiresLayout(var5)) {
  241.                   var2 = (new TextLayout(var1, this.font, this.frc)).getAdvance();
  242.                   break;
  243.                }
  244.  
  245.                var2 += this.handleCharWidth(var5);
  246.             }
  247.          }
  248.       }
  249.  
  250.       return (int)((double)0.5F + (double)var2);
  251.    }
  252.  
  253.    public int charsWidth(char[] var1, int var2, int var3) {
  254.       float var4 = 0.0F;
  255.       if (this.font.hasLayoutAttributes()) {
  256.          String var5 = new String(var1, var2, var3);
  257.          var4 = (new TextLayout(var5, this.font, this.frc)).getAdvance();
  258.       } else {
  259.          if (var3 < 0) {
  260.             throw new IndexOutOfBoundsException("len=" + var3);
  261.          }
  262.  
  263.          int var9 = var2 + var3;
  264.  
  265.          for(int var6 = var2; var6 < var9; ++var6) {
  266.             char var7 = var1[var6];
  267.             if (var7 < 256) {
  268.                var4 += this.getLatinCharWidth(var7);
  269.             } else {
  270.                if (this.requiresLayout(var7)) {
  271.                   String var8 = new String(var1, var2, var3);
  272.                   var4 = (new TextLayout(var8, this.font, this.frc)).getAdvance();
  273.                   break;
  274.                }
  275.  
  276.                var4 += this.handleCharWidth(var7);
  277.             }
  278.          }
  279.       }
  280.  
  281.       return (int)((double)0.5F + (double)var4);
  282.    }
  283.  
  284.    public int[] getWidths() {
  285.       int[] var1 = new int[256];
  286.  
  287.       for(char var2 = 0; var2 < 256; ++var2) {
  288.          float var3 = this.advCache[var2];
  289.          if (var3 == -1.0F) {
  290.             var3 = this.advCache[var2] = this.handleCharWidth(var2);
  291.          }
  292.  
  293.          var1[var2] = (int)((double)0.5F + (double)var3);
  294.       }
  295.  
  296.       return var1;
  297.    }
  298.  
  299.    public int getMaxAdvance() {
  300.       return (int)(0.99F + this.maxAdvance);
  301.    }
  302.  
  303.    public int getAscent() {
  304.       return (int)(roundingUpValue + this.ascent);
  305.    }
  306.  
  307.    public int getDescent() {
  308.       return (int)(roundingUpValue + this.descent);
  309.    }
  310.  
  311.    public int getLeading() {
  312.       return (int)(roundingUpValue + this.descent + this.leading) - (int)(roundingUpValue + this.descent);
  313.    }
  314.  
  315.    public int getHeight() {
  316.       if (this.height < 0) {
  317.          this.height = this.getAscent() + (int)(roundingUpValue + this.descent + this.leading);
  318.       }
  319.  
  320.       return this.height;
  321.    }
  322.  
  323.    // $FF: synthetic method
  324.    static HashMap access$000() {
  325.       return metricsCache;
  326.    }
  327. }
  328.